package org.mx.error;

import org.mx.spring.utils.I18nMessageUtils;

/**
 * 系统级错误异常
 *
 * @author : john.peng created on date : 2017.11.29
 */
public class UserInterfaceSystemErrorException extends UserInterfaceException {
	/**
	 * 
	 */
	private static final long serialVersionUID = -3169290332467238994L;

	/**
	 * 默认的构造函数
	 */
	public UserInterfaceSystemErrorException() {
		this(SystemErrors.SYSTEM_OTHER_FAIL);
	}

	/**
	 * 构造函数
	 *
	 * @param error 人机界面错误枚举
	 */
	public UserInterfaceSystemErrorException(SystemErrors error) {
		super(error.getErrorCode(), error.getErrorMessage());
	}

	/**
	 * 系统级错误信息枚举定义
	 */
	@SuppressWarnings("javadoc")
	public enum SystemErrors implements UserInterfaceError {
		SYSTEM_ILLEGAL_PARAM("输入的参数错误，请联系开发人员。"), SYSTEM_UNSUPPORTED_OPERATE("不支持的操作方法，请联系开发人员。"),
		SYSTEM_NO_SUCH_ALGORITHM("不支持的系统算法。"),

		SYSTEM_UNSUPPORTED("不支持的操作类型，请联系开发人员。"),

		CLASS_NOT_FOUND("指定的类不存在，请联系开发人员。"),

		FILE_NOT_EXISTED("指定的文件不存在，请联系开发人员。"), FILE_READ_ERROR("读取指定文件内容错误。"),

		SPRING_CACHE_REDIS_TYPE_UNSUPPORTED("不支持的Redis缓存类型。"),

		SYSTEM_OTHER_FAIL("未知的系统错误。");

		public static final int BASE_ORDINAL = 1;
		private String errorMessage;

		/**
		 * 构造函数
		 *
		 * @param errorMessage 错误信息
		 */
		SystemErrors(String errorMessage) {
			this.errorMessage = errorMessage;
		}

		/**
		 * {@inheritDoc}
		 *
		 * @see UserInterfaceError#getErrorCode()
		 */
		@Override
		public int getErrorCode() {
			return BASE_ORDINAL + super.ordinal();
		}

		/**
		 * {@inheritDoc}
		 * <p>
		 * 支持从多语言包中获取资源，如果获取不到，则返回设置的Message。
		 *
		 * @see UserInterfaceError#getErrorMessage()
		 */
		@Override
		public String getErrorMessage() {
			return I18nMessageUtils.getI18nMessage(super.name(), this.errorMessage);
		}
	}
}
